package com.chara.rabbitmq_demo.com.chara.rabbitmq.basic;

import com.rabbitmq.client.*;

import java.io.IOException;

/**
 * @Classname Consumer
 * @Description 消息消费者
 * @Date 2025/10/8 20:26
 * @Author Chara
 */
public class Consumer {

    public static void main(String[] args) throws Exception {

        // 1.创建连接工厂
        ConnectionFactory factory = new ConnectionFactory();

        // 2.设置参数
        factory.setHost("127.0.0.1");
        factory.setPort(5672);
        factory.setVirtualHost("/");
        factory.setUsername("guest");
        factory.setPassword("guest");

        // 3.创建连接
        Connection connection = factory.newConnection();

        // 4.创建通道
        Channel channel = connection.createChannel();

        //5.创建队列
        /**
         * 如果没有名叫demo_queue的队列，则创建，有则不创建
         * 参数1：队列名称
         * 参数2：是否持久化，true表示持久化，false表示不持久化
         * 参数3：是否独占队列，true表示独占，false表示不独占
         * 参数4：自动删除，true表示自动删除，false表示不自动删除
         * 参数5：队列其他参数
         */
        //channel.queueDeclare("demo_queue",true,false,false,null); 可有可无，生产者已经创建了

        // 接收消息
        DefaultConsumer consumer = new DefaultConsumer(channel){

            // 回调方法，当收到消息后，会自动执行该方法

            /**
             * @param consumerTag 消费者标签
             * @param envelope 获取消息的交换机、路由key等信息
             * @param properties 配置信息
             * @param body 消息内容
             */
            @Override
            public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                System.out.println("consumerTag:"+consumerTag);
                System.out.println("exchange:"+envelope.getExchange());
                System.out.println("routingKey:"+envelope.getRoutingKey());
                System.out.println("properties:"+properties);
                System.out.println("body:"+new String(body));
            }
        };

        /**
         * 参数1：队列名称
         * 参数2：是否自动确认，true表示自动确认，false表示手动确认
         * 参数3：回调对象
         */
        channel.basicConsume("demo_queue",true,consumer);

    }
}
